//
//  LcbNetworking.h
//  LcbNetworking
//
//  Created by lcb on 2017/1/22.
//  Copyright © 2017年 liuchengbin. All rights reserved.
//

#import <Foundation/Foundation.h>
/**
 *  网络状态
 */
typedef NS_ENUM(NSInteger, NetworkStatus) {
    /**
     *  未知网络
     */
    NetworkStatusUnknown             = 1 << 0,
    /**
     *  无法连接
     */
    NetworkStatusNotReachable        = 1 << 1,
    /**
     *  WWAN网络
     */
    NetworkStatusReachableViaWWAN    = 1 << 2,
    /**
     *  WiFi网络
     */
    NetworkStatusReachableViaWiFi    = 1 << 3
};
/**
 *  请求方式
 */
typedef NS_ENUM(NSUInteger, NRequestMethod) {
    NRequestMethod_GET = 1, // get请求方式
    NRequestMethod_POST  = 2 ,// post请求方式
    NRequestMethod_PUT  = 3 ,// post请求方式
    NRequestMethod_DELETE  = 4 // post请求方式
};
/**
 *  请求任务
 */
typedef NSURLSessionTask LcbURLSessionTask;

/**
 *  成功回调
 *
 *  @param response 成功后返回的数据
 */
typedef void(^LcbResponseSuccessBlock)(id response);

/**
 *  失败回调
 *
 *  @param error 失败后返回的错误信息
 */
typedef void(^LcbResponseFailBlock)(NSError *error);

/**
 *  下载进度
 *
 *  @param bytesRead              已下载的大小
 *  @param totalBytes                总下载大小
 */
typedef void (^LcbDownloadProgress)(int64_t bytesRead,
                                   int64_t totalBytes);

/**
 *  下载成功回调
 *
 *  @param url                       下载存放的路径
 */
typedef void(^LcbDownloadSuccessBlock)(NSURL *url);


/**
 *  上传进度
 *
 *  @param bytesWritten              已上传的大小
 *  @param totalBytes                总上传大小
 */
typedef void(^LcbUploadProgressBlock)(int64_t bytesWritten,
                                     int64_t totalBytes);
/**
 *  多文件上传成功回调
 *
 *  @param responses 成功后返回的数据
 */
typedef void(^LcbMultUploadSuccessBlock)(NSArray *responses);

/**
 *  多文件上传失败回调
 *
 *  @param errors 失败后返回的错误信息
 */
typedef void(^LcbMultUploadFailBlock)(NSArray *errors);

typedef LcbDownloadProgress LcbRequestProgress;

typedef LcbResponseFailBlock LcbDownloadFailBlock;

@interface LcbNetworking : NSObject

/*!
 *  开启或关闭接口打印信息
 *
 *  @param isDebug 开发期，最好打开，默认是NO
 */
+ (void)enableInterfaceDebug:(BOOL)isDebug;
/**
 *  正在运行的网络任务
 *
 */
+ (NSArray *)currentRunningTasks;

/**
 *  配置请求头
 *
 *  @param httpHeader 请求头
 */
+ (void)configHttpHeader:(NSDictionary *)httpHeader;

/**
 *  取消GET请求
 */
+ (void)cancelRequestWithURL:(NSString *)url;

/**
 *  取消所有请求
 */
+ (void)cancleAllRequest;

/**
 *	设置超时时间
 *
 *  @param timeout 超时时间
 */
+ (void)setupTimeout:(NSTimeInterval)timeout;

/**
 *  请求
 *
 *  @param url              请求路径
 *  @param method           请求方式
 *  @param cache            是否缓存
 *  @param refresh          是否刷新请求(遇到重复请求，若为YES，则会取消旧的请求，用新的请求，若为NO，则忽略新请求，用旧请求)
 *  @param params           拼接参数
 *  @param progressBlock    进度回调
 *  @param successBlock     成功回调
 *  @param failBlock        失败回调
 *
 *  @return 返回的对象中可取消请求
 */
+ (LcbURLSessionTask *)requestWithUrl:(NSString *)url
                              method:(NRequestMethod)method
                   refreshRequest:(BOOL)refresh
                            cache:(BOOL)cache
                           params:(NSDictionary *)params
                    progressBlock:(LcbRequestProgress)progressBlock
                     successBlock:(LcbResponseSuccessBlock)successBlock
                        failBlock:(LcbResponseFailBlock)failBlock;



/**
 *  文件上传
 *
 *  @param url              上传文件接口地址
 *  @param params           拼接参数
 *  @param data             上传文件数据
 *  @param type             上传文件类型
 *  @param name             上传文件服务器文件夹名
*  @param filename             上传文件服务器文件名
 *  @param mimeType         mimeType
 *  @param progressBlock    上传文件路径
 *	@param successBlock     成功回调
 *	@param failBlock		失败回调
 *
 *  @return 返回的对象中可取消请求
 */
+ (LcbURLSessionTask *)uploadFileWithUrl:(NSString *)url
                                 params:(NSDictionary *)params
                               fileData:(NSData *)data
                                   type:(NSString *)type
                                   name:(NSString *)name
                               fileName:(NSString *)filename
                               mimeType:(NSString *)mimeType
                          progressBlock:(LcbUploadProgressBlock)progressBlock
                           successBlock:(LcbResponseSuccessBlock)successBlock
                              failBlock:(LcbResponseFailBlock)failBlock;
/**
 *  多文件上传
 *
 *  @param url           上传文件地址
 *  @param params           拼接参数
 *  @param datas         数据集合
 *  @param progressBlock 上传进度
 *  @param successBlock  成功回调
 *  @param failBlock     失败回调
 *
 *  @return 任务集合
 */
+ (LcbURLSessionTask *)uploadFileWithUrl:(NSString *)url
                                 params:(NSDictionary *)params
                              fileDatas:(NSArray *)datas
                          progressBlock:(LcbUploadProgressBlock)progressBlock
                           successBlock:(LcbResponseSuccessBlock)successBlock
                              failBlock:(LcbResponseFailBlock)failBlock;


/**
 *  多文件上传
 *
 *  @param url           上传文件地址
 *  @param params           拼接参数
 *  @param datas         数据集合
 *  @param progressBlock 上传进度
 *  @param successBlock  成功回调
 *  @param failBlock     失败回调
 *
 *  @return 任务集合
 */
+ (NSArray *)uploadMultFileWithUrl:(NSString *)url
                            params:(NSDictionary *)params
                         fileDatas:(NSArray *)datas
                     progressBlock:(LcbUploadProgressBlock)progressBlock
                      successBlock:(LcbMultUploadSuccessBlock)successBlock
                         failBlock:(LcbMultUploadFailBlock)failBlock;

/**
 *  文件下载
 *
 *  @param url           下载文件接口地址
 *  @param progressBlock 下载进度
 *  @param successBlock  成功回调
 *  @param failBlock     下载回调
 *
 *  @return 返回的对象可取消请求
 */
+ (LcbURLSessionTask *)downloadWithUrl:(NSString *)url
                        progressBlock:(LcbDownloadProgress)progressBlock
                         successBlock:(LcbDownloadSuccessBlock)successBlock
                            failBlock:(LcbDownloadFailBlock)failBlock;

@end

@interface LcbNetworking (cache)

/**
 *  获取缓存目录路径
 *
 *  @return 缓存目录路径
 */
+ (NSString *)getCacheDiretoryPath;

/**
 *  获取下载目录路径
 *
 *  @return 下载目录路径
 */
+ (NSString *)getDownDirectoryPath;

/**
 *  获取缓存大小
 *
 *  @return 缓存大小
 */
+ (NSUInteger)totalCacheSize;

/**
 *  清除所有缓存
 */
+ (void)clearTotalCache;

/**
 *  获取所有下载数据大小
 *
 *  @return 下载数据大小
 */
+ (NSUInteger)totalDownloadDataSize;

/**
 *  清除下载数据
 */
+ (void)clearDownloadData;

@end
